﻿/*
 * Project: MortEdit
 * Version: 0.3.3.3
 * Last Modified: 13.09.2009
 * Author: Carmaris
 * Author's website: http://carmaris.wordpress.com
 * MortEdit jest to prosty edytor skryptów MortScript.
*/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Globalization;
using System.Threading;
using System.Collections;
using System.Resources;

using MortEdit.Properties;

namespace MortEdit
{
    // Klasa odpowiedzialna za obsługę formy
    public partial class Form1 : Form
    {
        private DialogResult dialogResult;  // coś używane przy dialogach/wynik

        public File file = new File();

        public Form1()
        {
            InitializeComponent();
            file.form1 = this;
        }                                      

        // Blokowanie richEditBoxa wymaga importu liba...
        [DllImport("user32.dll")]
        public static extern bool LockWindowUpdate(IntPtr hWndLock);

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {
            // Ustawienie tegoż boola, że było cuś modyfikowane
            file.isModified = true;

            // Oznaczenie na pasku tytułu, że coś było modyfikowane
            if (!(ActiveForm.Text.Contains("* ")))
            {
                ActiveForm.Text = "* " + ActiveForm.Text;
            }

            cofnijToolStripMenuItem.Enabled = true;
            cofnijToolStripMenuItem1.Enabled = true;

            try
            {
                // Zablokowanie zmian w richTextBox
                LockWindowUpdate(richTextBox.Handle);
                richTextBox.UpdateSyntaxHightlight();
            }
            finally
            {
                LockWindowUpdate(IntPtr.Zero);
            }
        }

        private void richTextBox_CursorPositionChanged(object sender, EventArgs e)
        {
            UpdatePosition();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            SaveFormSettings();
            CheckModified(sender, e);
        }

        // sprawdza czy plik był modyfikowany;
        // jeśli tak - wyświetlenie monitu o zapis
        public void CheckModified(object sender, System.EventArgs e)
        {
            if (file.isModified == true)
            {
                dialogResult = MessageBox.Show("Czy chcesz zapisać zmiany?",
                                               "Pytanie",
                                               MessageBoxButtons.YesNo,
                                               MessageBoxIcon.Question);
                if (dialogResult == DialogResult.Yes)
                {
                    file.Save(sender, e);
                }
            }
        }

        // Uaktualnia pozycję kursora
        private void UpdatePosition()
        {
            int line = richTextBox.CurrentLine;
            int column = richTextBox.CurrentColumn;
            
            toolStripStatusPosition.Text = ("Ln: " + line + ", Col: " + column);
        }

        // Zapisuje ustawienia formy
        private void SaveFormSettings()
        {
            Settings.Default.wordWrap = richTextBox.WordWrap;
            Settings.Default.Font = richTextBox.Font;
            Settings.Default.size = Form1.ActiveForm.Size;
            Settings.Default.Save();
        }

        // Wczytuje ustawienia formy
        private void LoadFormSettings()
        {
            this.zawijajWierszeToolStripMenuItem.Checked = Settings.Default.wordWrap;
            this.richTextBox.WordWrap = Settings.Default.wordWrap;
            this.richTextBox.Font = Settings.Default.Font;
            this.fontDialog.Font = Settings.Default.Font;
            this.Size = Settings.Default.size;
        }
        
        private void FileOpen(object sender, EventArgs e)
        {
            // Funkcja odpowiedzialna za otwarcie pliku
            file.Open(sender, e);
            cofnijToolStripMenuItem.Enabled = false;
            ActiveForm.Text = "MortEdit " + file.actualFileName;
        }

        private void FileNew(object sender, EventArgs e)
        {
            file.New(sender, e);

            ActiveForm.Text = "MortEdit";
            cofnijToolStripMenuItem.Enabled = false;
        }

        private void FileSave(object sender, EventArgs e)
        {
            file.Save(sender, e);
            this.zapiszToolStripMenuItem.Enabled = true;
            this.Text = "MortEdit - " + file.actualFileName;
        }

        private void FontChange(object sender, EventArgs e)
        {
            // Pokazanie dialogu czcionek
            dialogResult = fontDialog.ShowDialog();
            if (dialogResult == DialogResult.Cancel)
                return;

            FontFamily fmFontName = fontDialog.Font.FontFamily;

            // Wybrany rozmiar czcionki
            float fFontSize = fontDialog.Font.Size;
            // Wybrany styl czcionki
            FontStyle fsStyle = fontDialog.Font.Style;
            Font font;
            try
            {
                // Ustawienie czcionki do richTextBox1'a
                font = new Font(fmFontName, fFontSize, fsStyle);
                richTextBox.Font = font;
            }
            catch (ArgumentException)
            {
                return;
            }
        }

        private void EditUndo()
        {
            richTextBox.Undo();
        }

        private void EditRedo()
        {
            richTextBox.Redo();
        }

        private void EditCut()
        {
            richTextBox.Cut();
        }

        private void EditCopy()
        {
            richTextBox.Copy();
        }

        private void EditPaste()
        {
            richTextBox.Paste();
        }

        private void EditSelectAll()
        {
            richTextBox.SelectAll();
        }

        private void HelpAbout()
        {
            MessageBox.Show("MortEdit 0.3.3.3\n\n" +
                "Program ten to prosty edytor tekstu, " + 
            "napisany głównie z myślą o plikach MortScripta. " +
            "Aplikacja ma zaimplementowaną funkcję kolorowania jego składni. " +
            "W przyszłości postaram się rozszerzyć funkcjonalność edytora.\n\n " +
            "Podziękowania dla:" + 
            "\n- twórcy MortScripta, bez którego sens istnienia programu by nie istniał" + 
            "\n- Promhylerów" + 
            "\n\nZ dedykacją dla użytkowników for e72.pl i pdaclub.pl.",
                            "O programie",
                            MessageBoxButtons.OK);
        }

        private void nowyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.FileNew(sender, e);
        }

        private void zapiszJakoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            file.SaveAs(sender, e);
        }

        private void otwórzToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FileOpen(sender, e);
        }

        private void zapiszToolStripMenuItem_Click(object sender, EventArgs e)
        {
            file.Save(sender, e);
        }

        private void czcionkaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FontChange(sender, e);
        }

        // zamyka program
        private void zakończToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void zawijanieWierszyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // Wł/Wył zawijanie wierszy
            if (richTextBox.WordWrap == true)
            {
                richTextBox.WordWrap = false;
                zawijajWierszeToolStripMenuItem.Checked = false;
            }
            else
            {
                richTextBox.WordWrap = true;
                zawijajWierszeToolStripMenuItem.Checked = true;
            }
        }

        private void wytnijToolStripMenuItem_Click(object sender, EventArgs e)
        {
            EditCut();
        }

        private void wklejToolStripMenuItem_Click(object sender, EventArgs e)
        {
            EditPaste();
        }

        private void kopiujToolStripMenuItem_Click(object sender, EventArgs e)
        {
            EditCopy();
        }

        private void zaznaczWszystkoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            EditSelectAll();
        }

        private void powtórzToolStripMenuItem_Click(object sender, EventArgs e)
        {
            EditRedo();
        }

        private void cofnijToolStripMenuItem_Click(object sender, EventArgs e)
        {
            EditUndo();
        }

        private void oProgramiToolStripMenuItem_Click(object sender, EventArgs e)
        {
            HelpAbout();
        }

        private void toolbarNew_Click(object sender, EventArgs e)
        {
            FileNew(sender, e);
        }

        private void toolbarOpen_Click(object sender, EventArgs e)
        {
            FileOpen(sender, e);
        }

        private void toolbarSave_Click(object sender, EventArgs e)
        {
            FileSave(sender, e);
        }

        private void toolbarUndo_Click(object sender, EventArgs e)
        {
            EditUndo();
        }

        private void toolbarRedo_Click(object sender, EventArgs e)
        {
            EditRedo();
        }

        private void toolbarCut_Click(object sender, EventArgs e)
        {
            EditCut();
        }

        private void toolbarCopy_Click(object sender, EventArgs e)
        {
            EditCopy();
        }

        private void toolbarPaste_Click(object sender, EventArgs e)
        {
            EditPaste();
        }

        private void toolbarAbout_Click(object sender, EventArgs e)
        {
            HelpAbout();
        }

        private void toolbarClose_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void cofnijToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            EditUndo();
        }

        private void wytnijToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            EditCut();
        }

        private void kopiujToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            EditCopy();
        }

        private void wklejToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            EditPaste();
        }

        private void zaznaczWszystkoToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            EditSelectAll();
        }

        // załadowanie formy
        private void Form1_Load(object sender, EventArgs e)
        {
            LoadFormSettings();
        }

        private void richTextBox_MouseUp(object sender, MouseEventArgs e)
        {
            if (richTextBox.SelectionLength > 0)
            {
                this.kopiujToolBarItem.Enabled = true;
                this.wytnijToolBarItem.Enabled = true;
                this.wytnijToolStripMenuItem1.Enabled = true;
                this.kopiujToolStripMenuItem1.Enabled = true;
                this.wytnijToolStripMenuItem.Enabled = true;
                this.kopiujToolStripMenuItem.Enabled = true;
            }
            else
            {
                this.kopiujToolBarItem.Enabled = false;
                this.wytnijToolBarItem.Enabled = false;
                this.wytnijToolStripMenuItem1.Enabled = false;
                this.kopiujToolStripMenuItem1.Enabled = false;
                this.wytnijToolStripMenuItem.Enabled = false;
                this.kopiujToolStripMenuItem.Enabled = false;
            }
        }

        private void toolbarRunOnPC_Click(object sender, EventArgs e)
        {
            file.RunOnPC(sender, e);
            this.Text = "MortEdit - " + file.actualFileName;
        }

        private void wykonajNaKomputerzeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            file.RunOnPC(sender, e);
            this.Text = "MortEdit - " + file.actualFileName;
        }
    }
}